#include "rc_receiver.h"

// 全局变量
static RC_HandleTypeDef rc;
static TIM_HandleTypeDef *rc_timer;
static uint32_t capture_values[RC_CHANNELS * 2];  // 存储捕获值
static uint8_t capture_index = 0;
static uint8_t current_channel = 0;

// 初始化遥控接收器
void RC_Init(TIM_HandleTypeDef *htim) {
    rc_timer = htim;
    
    // 初始化通道数据
    for (uint8_t i = 0; i < RC_CHANNELS; i++) {
        rc.channel[i] = 0;
    }
    rc.data_ready = 0;
    
    // 启动输入捕获
    HAL_TIM_IC_Start_IT(rc_timer, TIM_CHANNEL_1);
}

// 输入捕获回调函数
void RC_InputCaptureCallback(TIM_HandleTypeDef *htim) {
    if (htim == rc_timer) {
        // 存储捕获值
        capture_values[capture_index++] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
        
        // 每捕获到两个值(上升沿和下降沿)计算一个通道的PWM
        if (capture_index >= 2) {
            // 计算脉宽(微秒)
            uint32_t pulse_width;
            
            // 处理定时器溢出情况
            if (capture_values[1] >= capture_values[0]) {
                pulse_width = capture_values[1] - capture_values[0];
            } else {
                pulse_width = (rc_timer->Init.Period - capture_values[0]) + capture_values[1];
            }
            
            // 转换为微秒(假设定时器频率为1MHz)
            pulse_width /= 1;  // 如果PSC设置正确，这里可以简化
            
            // 限制在有效范围内
            if (pulse_width > PWM_MAX) pulse_width = PWM_MAX;
            if (pulse_width < PWM_MIN) pulse_width = PWM_MIN;
            
            // 存储到相应通道
            rc.channel[current_channel] = pulse_width;
            
            // 重置捕获索引
            capture_index = 0;
            
            // 切换到下一个通道
            current_channel++;
            
            // 所有通道都更新后设置数据就绪标志
            if (current_channel >= RC_CHANNELS) {
                current_channel = 0;
                rc.data_ready = 1;
            }
        }
    }
}

// 检查数据是否就绪
uint8_t RC_DataReady(void) {
    return rc.data_ready;
}

// 获取所有通道值
void RC_GetChannels(uint16_t *channels) {
    if (rc.data_ready) {
        for (uint8_t i = 0; i < RC_CHANNELS; i++) {
            channels[i] = rc.channel[i];
        }
        rc.data_ready = 0;  // 清除就绪标志
    }
}

